home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1995-10-26 | 2.4 KB | 84 lines |
- Syntax10.Scn.Fnt
- Syntax20.Scn.Fnt
- MODULE AmigaBase; (* cn/shml 8-Mar-1993 *)
- IMPORT
- S:=SYSTEM;
- CONST
- d0*=0; d1*=1; d2*=2; d3*=3; d4*=4; d5*=5; d6*=6; d7*=7;
- a0*=8; a1*=9; a2*=10; a3*=11; a4*=12; a5*=13; a6*=14; a7*=15;
- Regs*=RECORD
- d*:ARRAY 8 OF LONGINT;
- a*:ARRAY 6 OF LONGINT;
- END;
- LibProc=PROCEDURE;
- base:LONGINT;
- proc:LONGINT;
- tmpR:Regs;
- PROCEDURE -PushA6 2FH,0EH;
- (* MOVE.L A6,-(A7) *)
- NOTE
- The following two procedures are dependent on the compiler
- code generation, as they contain PC-relative offsets.
- (* NEW COMPILER *)
- PROCEDURE -Call 04EH,0BBH,001H,061H,0FFH,086H;
- (* new compiler: JSR (-8,SB=-122(PC)) (base) *)
- PROCEDURE -StoreA0 04DH,0FAH,0FFH,068H,02CH,088H;
- (* new compiler: LEA -32,SB=-152(PC),A6 MOVE.L A0,(A6) *)
- (* OLD COMPILER *)
- PROCEDURE -Call 04EH,0BBH,001H,061H,0FFH,082H;
- (* old compiler: JSR (-8,SB=-126(PC)) (base) *)
- PROCEDURE -StoreA0 04DH,0FAH,0FFH,064H,02CH,088H;
- (* old compiler: LEA -32,SB=-156(PC),A6 MOVE.L A0,(A6) *)
- PROCEDURE -PopA6 02CH,05FH;
- PROCEDURE LibCall*(libBase:LONGINT; offset:LONGINT; VAR r:Regs);
- WARNING: LibCall is *NOT* reentrant.
- BEGIN
- tmpR:=r;
- base:=libBase;
- proc:=libBase+offset;
- S.PUTREG(a0,tmpR.a[0]);
- S.PUTREG(a1,tmpR.a[1]);
- S.PUTREG(a2,tmpR.a[2]);
- S.PUTREG(a3,tmpR.a[3]);
- S.PUTREG(a4,tmpR.a[4]);
- S.PUTREG(a5,tmpR.a[5]);
- S.PUTREG(d0,tmpR.d[0]);
- S.PUTREG(d1,tmpR.d[1]);
- S.PUTREG(d2,tmpR.d[2]);
- S.PUTREG(d3,tmpR.d[3]);
- S.PUTREG(d4,tmpR.d[4]);
- S.PUTREG(d5,tmpR.d[5]);
- S.PUTREG(d6,tmpR.d[6]);
- S.PUTREG(d7,tmpR.d[7]);
- PushA6;
- S.PUTREG(a6,base);
- Call;
- (* proc(); Uses A0 register, therfore replaced by assembler hack *)
- StoreA0;
- (* S.GETREG(a0,tmpR.a[0]); destroys A0 before saving, therefore assembler needed *)
- PopA6;
- (* S.GETREG(d0,tmpR.d[0]);
- S.GETREG(d1,tmpR.d[1]);
- S.GETREG(d2,tmpR.d[2]);
- S.GETREG(d3,tmpR.d[3]);
- S.GETREG(d4,tmpR.d[4]);
- S.GETREG(d5,tmpR.d[5]);
- S.GETREG(d6,tmpR.d[6]);
- S.GETREG(d7,tmpR.d[7]);
- S.GETREG(a1,tmpR.a[1]);
- S.GETREG(a2,tmpR.a[2]);
- S.GETREG(a3,tmpR.a[3]);
- S.GETREG(a4,tmpR.a[4]);
- S.GETREG(a5,tmpR.a[5]);
- r:=tmpR;*)
- S.GETREG(d0,r.d[0]); (* I think that is enough *)
- S.GETREG(d1,r.d[1]);
- END LibCall;
- PROCEDURE ExecBase*():LONGINT;
- p:LONGINT;
- BEGIN
- S.GET(4,p);
- RETURN p;
- END ExecBase;
- END AmigaBase.
-